home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / gedit-2 / plugins / snippets / Document.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  22.5 KB  |  729 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import re
  6. import gtk
  7. from gtk import gdk
  8. import gio
  9. import gedit
  10. from Library import Library
  11. from Snippet import Snippet
  12. from Placeholder import *
  13. from SnippetComplete import SnippetComplete
  14.  
  15. class Document:
  16.     TAB_KEY_VAL = (gtk.keysyms.Tab, gtk.keysyms.ISO_Left_Tab)
  17.     SPACE_KEY_VAL = (gtk.keysyms.space,)
  18.     
  19.     def __init__(self, instance, view):
  20.         self.view = None
  21.         self.instance = instance
  22.         self.placeholders = []
  23.         self.active_snippets = []
  24.         self.active_placeholder = None
  25.         self.signal_ids = { }
  26.         self.ordered_placeholders = []
  27.         self.update_placeholders = []
  28.         self.jump_placeholders = []
  29.         self.language_id = 0
  30.         self.timeout_update_id = 0
  31.         Library().ref(None)
  32.         self.set_view(view)
  33.  
  34.     
  35.     def stop(self):
  36.         if self.timeout_update_id != 0:
  37.             gobject.source_remove(self.timeout_update_id)
  38.             self.timeout_update_id = 0
  39.             del self.update_placeholders[:]
  40.             del self.jump_placeholders[:]
  41.         
  42.         Library().unref(None)
  43.         self.set_view(None)
  44.         self.instance = None
  45.         self.active_placeholder = None
  46.  
  47.     
  48.     def disconnect_signal(self, obj, signal):
  49.         if (obj, signal) in self.signal_ids:
  50.             obj.disconnect(self.signal_ids[(obj, signal)])
  51.             del self.signal_ids[(obj, signal)]
  52.         
  53.  
  54.     
  55.     def connect_signal(self, obj, signal, cb):
  56.         self.disconnect_signal(obj, signal)
  57.         self.signal_ids[(obj, signal)] = obj.connect(signal, cb)
  58.  
  59.     
  60.     def connect_signal_after(self, obj, signal, cb):
  61.         self.disconnect_signal(obj, signal)
  62.         self.signal_ids[(obj, signal)] = obj.connect_after(signal, cb)
  63.  
  64.     
  65.     def _set_view(self, view):
  66.         if self.view:
  67.             buf = self.view.get_buffer()
  68.             signals = {
  69.                 self.view: ('key-press-event', 'destroy', 'notify::editable', 'drag-data-received'),
  70.                 buf: ('notify::language', 'changed', 'cursor-moved', 'insert-text') }
  71.             for obj, sig in signals.items():
  72.                 for s in sig:
  73.                     self.disconnect_signal(obj, s)
  74.                 
  75.             
  76.             for snippet in list(self.active_snippets):
  77.                 self.deactivate_snippet(snippet, True)
  78.             
  79.         
  80.         self.view = view
  81.         if view != None:
  82.             buf = view.get_buffer()
  83.             self.connect_signal(view, 'destroy', self.on_view_destroy)
  84.             if view.get_editable():
  85.                 self.connect_signal(view, 'key-press-event', self.on_view_key_press)
  86.             
  87.             self.connect_signal(buf, 'notify::language', self.on_notify_language)
  88.             self.connect_signal(view, 'notify::editable', self.on_notify_editable)
  89.             self.connect_signal(view, 'drag-data-received', self.on_drag_data_received)
  90.             self.update_language()
  91.         elif self.language_id != 0:
  92.             langid = self.language_id
  93.             self.language_id = None
  94.             if self.instance:
  95.                 self.instance.language_changed(self)
  96.             
  97.             Library().unref(langid)
  98.         
  99.  
  100.     
  101.     def set_view(self, view):
  102.         if view == self.view:
  103.             return None
  104.         self._set_view(view)
  105.  
  106.     
  107.     def update_language(self):
  108.         lang = self.view.get_buffer().get_language()
  109.         if lang == None and self.language_id == None:
  110.             return None
  111.         if lang and lang.get_id() == self.language_id:
  112.             return None
  113.         langid = self.language_id
  114.         if self.instance:
  115.             self.instance.language_changed(self)
  116.         
  117.         if langid != 0:
  118.             Library().unref(langid)
  119.         
  120.         Library().ref(self.language_id)
  121.  
  122.     
  123.     def accelerator_activate(self, keyval, mod):
  124.         if not (self.view) or not self.view.get_editable():
  125.             return None
  126.         accelerator = gtk.accelerator_name(keyval, mod)
  127.         snippets = Library().from_accelerator(accelerator, self.language_id)
  128.         snippets_debug('Accel!')
  129.         if len(snippets) == 0:
  130.             return False
  131.         if len(snippets) == 1:
  132.             self.apply_snippet(snippets[0])
  133.         else:
  134.             return self.show_completion(snippets)
  135.         return len(snippets) == 0
  136.  
  137.     
  138.     def first_snippet_inserted(self):
  139.         buf = self.view.get_buffer()
  140.         self.connect_signal(buf, 'changed', self.on_buffer_changed)
  141.         self.connect_signal(buf, 'cursor-moved', self.on_buffer_cursor_moved)
  142.         self.connect_signal_after(buf, 'insert-text', self.on_buffer_insert_text)
  143.  
  144.     
  145.     def last_snippet_removed(self):
  146.         buf = self.view.get_buffer()
  147.         self.disconnect_signal(buf, 'changed')
  148.         self.disconnect_signal(buf, 'cursor-moved')
  149.         self.disconnect_signal(buf, 'insert-text')
  150.  
  151.     
  152.     def current_placeholder(self):
  153.         buf = self.view.get_buffer()
  154.         piter = buf.get_iter_at_mark(buf.get_insert())
  155.         found = []
  156.         for placeholder in self.placeholders:
  157.             begin = placeholder.begin_iter()
  158.             end = placeholder.end_iter()
  159.             if piter.compare(begin) >= 0 and piter.compare(end) <= 0:
  160.                 found.append(placeholder)
  161.                 continue
  162.         
  163.         if self.active_placeholder in found:
  164.             return self.active_placeholder
  165.         if len(found) > 0:
  166.             return found[0]
  167.         return None
  168.  
  169.     
  170.     def advance_placeholder(self, direction):
  171.         buf = self.view.get_buffer()
  172.         piter = buf.get_iter_at_mark(buf.get_insert())
  173.         found = None
  174.         current = None
  175.         next = None
  176.         length = len(self.placeholders)
  177.         placeholders = list(self.placeholders)
  178.         if self.active_placeholder:
  179.             begin = self.active_placeholder.begin_iter()
  180.             end = self.active_placeholder.end_iter()
  181.             if piter.compare(begin) >= 0 and piter.compare(end) <= 0:
  182.                 current = self.active_placeholder
  183.                 currentIndex = placeholders.index(self.active_placeholder)
  184.             
  185.         
  186.         if direction == 1:
  187.             
  188.             nearest = lambda w, x, y, z: if not w.compare(x) <= 0 and not z:
  189. passx.compare(z.begin_iter()) < 0
  190.             
  191.             indexer = lambda x: x < length - 1
  192.         else:
  193.             
  194.             nearest = lambda w, x, y, z: if not w.compare(x) >= 0 and not z:
  195. passx.compare(z.begin_iter()) >= 0
  196.             
  197.             indexer = lambda x: x > 0
  198.         for index in range(0, length):
  199.             placeholder = placeholders[index]
  200.             begin = placeholder.begin_iter()
  201.             end = placeholder.end_iter()
  202.             if nearest(piter, begin, end, found):
  203.                 foundIndex = index
  204.                 found = placeholder
  205.             
  206.             if piter.compare(begin) >= 0 and piter.compare(end) <= 0 and current == None:
  207.                 currentIndex = index
  208.                 current = placeholder
  209.                 continue
  210.         
  211.         if current and current != found:
  212.             if (current.begin_iter().compare(found.begin_iter()) == 0 or current.end_iter().compare(found.begin_iter()) == 0) and self.active_placeholder and current.begin_iter().compare(self.active_placeholder.begin_iter()) == 0:
  213.                 current = self.active_placeholder
  214.                 currentIndex = placeholders.index(current)
  215.                 found = current
  216.             
  217.         if current and current == found:
  218.             if indexer(currentIndex):
  219.                 next = placeholders[currentIndex + direction]
  220.             
  221.         elif found:
  222.             next = found
  223.         elif length > 0:
  224.             next = self.placeholders[0]
  225.         
  226.         return (current, next)
  227.  
  228.     
  229.     def next_placeholder(self):
  230.         return self.advance_placeholder(1)
  231.  
  232.     
  233.     def previous_placeholder(self):
  234.         return self.advance_placeholder(-1)
  235.  
  236.     
  237.     def cursor_on_screen(self):
  238.         buf = self.view.get_buffer()
  239.         self.view.scroll_mark_onscreen(buf.get_insert())
  240.  
  241.     
  242.     def set_active_placeholder(self, placeholder):
  243.         self.active_placeholder = placeholder
  244.  
  245.     
  246.     def goto_placeholder(self, current, next):
  247.         last = None
  248.         if current:
  249.             current.leave()
  250.             if current.__class__ == PlaceholderEnd:
  251.                 last = current
  252.             
  253.         
  254.         self.set_active_placeholder(next)
  255.         if next:
  256.             next.enter()
  257.             if next.__class__ == PlaceholderEnd:
  258.                 last = next
  259.             
  260.         
  261.         if last:
  262.             for snippet in list(self.active_snippets):
  263.                 if snippet.placeholders[0] == last:
  264.                     self.deactivate_snippet(snippet)
  265.                     break
  266.                     continue
  267.             
  268.         
  269.         self.cursor_on_screen()
  270.         return next != None
  271.  
  272.     
  273.     def skip_to_next_placeholder(self):
  274.         (current, next) = self.next_placeholder()
  275.         return self.goto_placeholder(current, next)
  276.  
  277.     
  278.     def skip_to_previous_placeholder(self):
  279.         (current, prev) = self.previous_placeholder()
  280.         return self.goto_placeholder(current, prev)
  281.  
  282.     
  283.     def env_get_selected_text(self, buf):
  284.         bounds = buf.get_selection_bounds()
  285.         if bounds:
  286.             return buf.get_text(bounds[0], bounds[1])
  287.         return ''
  288.  
  289.     
  290.     def env_get_current_word(self, buf):
  291.         (start, end) = buffer_word_boundary(buf)
  292.         return buf.get_text(start, end)
  293.  
  294.     
  295.     def env_get_filename(self, buf):
  296.         uri = buf.get_uri()
  297.         if uri:
  298.             return buf.get_uri_for_display()
  299.         return ''
  300.  
  301.     
  302.     def env_get_basename(self, buf):
  303.         uri = buf.get_uri()
  304.         if uri:
  305.             return os.path.basename(buf.get_uri_for_display())
  306.         return ''
  307.  
  308.     
  309.     def update_environment(self):
  310.         buf = self.view.get_buffer()
  311.         variables = {
  312.             'GEDIT_SELECTED_TEXT': self.env_get_selected_text,
  313.             'GEDIT_CURRENT_WORD': self.env_get_current_word,
  314.             'GEDIT_FILENAME': self.env_get_filename,
  315.             'GEDIT_BASENAME': self.env_get_basename }
  316.         for var in variables:
  317.             os.environ[var] = variables[var](buf)
  318.         
  319.  
  320.     
  321.     def uses_current_word(self, snippet):
  322.         matches = re.findall('(\\\\*)\\$GEDIT_CURRENT_WORD', snippet['text'])
  323.         for match in matches:
  324.             if len(match) % 2 == 0:
  325.                 return True
  326.         
  327.         return False
  328.  
  329.     
  330.     def apply_snippet(self, snippet, start = None, end = None):
  331.         if not snippet.valid:
  332.             return False
  333.         buf = self.view.get_buffer()
  334.         s = Snippet(snippet)
  335.         if not start:
  336.             start = buf.get_iter_at_mark(buf.get_insert())
  337.         
  338.         if not end:
  339.             end = buf.get_iter_at_mark(buf.get_selection_bound())
  340.         
  341.         if start.equal(end) and self.uses_current_word(s):
  342.             (start, end) = buffer_word_boundary(buf)
  343.         
  344.         self.update_environment()
  345.         (current, next) = self.next_placeholder()
  346.         if current and current.__class__ == PlaceholderEnd:
  347.             self.goto_placeholder(current, None)
  348.         
  349.         buf.begin_user_action()
  350.         buf.delete(start, end)
  351.         holders = len(self.placeholders)
  352.         if len(self.active_snippets) == 0:
  353.             self.first_snippet_inserted()
  354.         
  355.         sn = s.insert_into(self, start)
  356.         self.active_snippets.append(sn)
  357.         keys = filter((lambda x: x > 0), sn.placeholders.keys())
  358.         if len(keys) == 0:
  359.             buf.place_cursor(sn.begin_iter())
  360.         else:
  361.             self.goto_placeholder(self.active_placeholder, sn.placeholders[keys[0]])
  362.         buf.end_user_action()
  363.         return True
  364.  
  365.     
  366.     def get_tab_tag(self, buf):
  367.         end = buf.get_iter_at_mark(buf.get_insert())
  368.         start = end.copy()
  369.         word = None
  370.         if start.backward_word_start():
  371.             tmp = start.copy()
  372.             tmp.forward_word_end()
  373.             if tmp.equal(end):
  374.                 word = buf.get_text(start, end)
  375.             else:
  376.                 start = end.copy()
  377.         else:
  378.             start = end.copy()
  379.         if not word or word == '':
  380.             if start.backward_char():
  381.                 word = start.get_char()
  382.                 if word.isalnum() or word.isspace():
  383.                     return (None, None, None)
  384.             else:
  385.                 return (None, None, None)
  386.         start.backward_char()
  387.         return (word, start, end)
  388.  
  389.     
  390.     def run_snippet(self):
  391.         if not self.view:
  392.             return False
  393.         buf = self.view.get_buffer()
  394.         (word, start, end) = self.get_tab_tag(buf)
  395.         if not word:
  396.             return self.skip_to_next_placeholder()
  397.         snippets = Library().from_tag(word, self.language_id)
  398.         if snippets:
  399.             if len(snippets) == 1:
  400.                 return self.apply_snippet(snippets[0], start, end)
  401.             return self.show_completion(snippets)
  402.         snippets
  403.         return self.skip_to_next_placeholder()
  404.  
  405.     
  406.     def deactivate_snippet(self, snippet, force = False):
  407.         buf = self.view.get_buffer()
  408.         remove = []
  409.         for tabstop in snippet.placeholders:
  410.             if tabstop == -1:
  411.                 placeholders = snippet.placeholders[-1]
  412.             else:
  413.                 placeholders = [
  414.                     snippet.placeholders[tabstop]]
  415.             for placeholder in placeholders:
  416.                 if placeholder in self.placeholders:
  417.                     if placeholder in self.update_placeholders:
  418.                         placeholder.update_contents()
  419.                         self.update_placeholders.remove(placeholder)
  420.                     elif placeholder in self.jump_placeholders:
  421.                         placeholder[0].leave()
  422.                     
  423.                     remove.append(placeholder)
  424.                     continue
  425.             
  426.         
  427.         for placeholder in remove:
  428.             if placeholder == self.active_placeholder:
  429.                 self.active_placeholder = None
  430.             
  431.             self.placeholders.remove(placeholder)
  432.             self.ordered_placeholders.remove(placeholder)
  433.             placeholder.remove(force)
  434.         
  435.         snippet.deactivate()
  436.         self.active_snippets.remove(snippet)
  437.         if len(self.active_snippets) == 0:
  438.             self.last_snippet_removed()
  439.         
  440.  
  441.     
  442.     def move_completion_window(self, complete, x, y):
  443.         MARGIN = 15
  444.         screen = self.view.get_screen()
  445.         width = screen.get_width()
  446.         height = screen.get_height()
  447.         (cw, ch) = complete.get_size()
  448.         if x + cw > width:
  449.             x = width - cw - MARGIN
  450.         elif x < MARGIN:
  451.             x = MARGIN
  452.         
  453.         if y + ch > height:
  454.             y = height - ch - MARGIN
  455.         elif y < MARGIN:
  456.             y = MARGIN
  457.         
  458.         complete.move(x, y)
  459.  
  460.     
  461.     def show_completion(self, preset = None):
  462.         buf = self.view.get_buffer()
  463.         bounds = buf.get_selection_bounds()
  464.         prefix = None
  465.         if not bounds and not preset:
  466.             (prefix, start, end) = self.get_tab_tag(buf)
  467.         
  468.         if not prefix:
  469.             end = buf.get_iter_at_mark(buf.get_insert())
  470.         
  471.         if not preset or len(preset) == 0:
  472.             nodes = Library().get_snippets(None)
  473.             if self.language_id:
  474.                 nodes += Library().get_snippets(self.language_id)
  475.             
  476.             if prefix and len(prefix) == 1 and not prefix.isalnum():
  477.                 hasnodes = False
  478.                 for node in nodes:
  479.                     if node['tag'] and node['tag'].startswith(prefix):
  480.                         hasnodes = True
  481.                         break
  482.                         continue
  483.                 
  484.                 if not hasnodes:
  485.                     prefix = None
  486.                 
  487.             
  488.             complete = SnippetComplete(nodes, prefix, False)
  489.         else:
  490.             complete = SnippetComplete(preset, None, True)
  491.         complete.connect('snippet-activated', self.on_complete_row_activated)
  492.         rect = self.view.get_iter_location(end)
  493.         win = self.view.get_window(gtk.TEXT_WINDOW_TEXT)
  494.         (x, y) = self.view.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, rect.x + rect.width, rect.y)
  495.         (xor, yor) = win.get_origin()
  496.         self.move_completion_window(complete, x + xor, y + yor)
  497.         return complete.run()
  498.  
  499.     
  500.     def update_snippet_contents(self):
  501.         self.timeout_update_id = 0
  502.         for placeholder in self.update_placeholders:
  503.             placeholder.update_contents()
  504.         
  505.         for placeholder in self.jump_placeholders:
  506.             self.goto_placeholder(placeholder[0], placeholder[1])
  507.         
  508.         del self.update_placeholders[:]
  509.         del self.jump_placeholders[:]
  510.         return False
  511.  
  512.     
  513.     def on_view_destroy(self, view):
  514.         self.stop()
  515.  
  516.     
  517.     def on_complete_row_activated(self, complete, snippet):
  518.         buf = self.view.get_buffer()
  519.         bounds = buf.get_selection_bounds()
  520.         if bounds:
  521.             self.apply_snippet(snippet.data, None, None)
  522.         else:
  523.             (word, start, end) = self.get_tab_tag(buf)
  524.             self.apply_snippet(snippet.data, start, end)
  525.  
  526.     
  527.     def on_buffer_cursor_moved(self, buf):
  528.         piter = buf.get_iter_at_mark(buf.get_insert())
  529.         for snippet in list(self.active_snippets):
  530.             if snippet.begin_mark.get_deleted() or snippet.end_mark.get_deleted():
  531.                 self.deactivate(snippet)
  532.                 continue
  533.             begin = snippet.begin_iter()
  534.             end = snippet.end_iter()
  535.             if piter.compare(begin) < 0 or piter.compare(end) > 0:
  536.                 self.deactivate_snippet(snippet)
  537.                 continue
  538.         
  539.         current = self.current_placeholder()
  540.         if current != self.active_placeholder:
  541.             if self.active_placeholder:
  542.                 self.jump_placeholders.append((self.active_placeholder, current))
  543.                 if self.timeout_update_id == 0:
  544.                     self.timeout_update_id = gobject.timeout_add(0, self.update_snippet_contents)
  545.                 
  546.             
  547.             self.set_active_placeholder(current)
  548.         
  549.  
  550.     
  551.     def on_buffer_changed(self, buf):
  552.         current = self.current_placeholder()
  553.         if current:
  554.             if current not in self.update_placeholders:
  555.                 self.update_placeholders.append(current)
  556.             
  557.             if self.timeout_update_id == 0:
  558.                 self.timeout_update_id = gobject.timeout_add(0, self.update_snippet_contents)
  559.             
  560.         
  561.  
  562.     
  563.     def on_buffer_insert_text(self, buf, piter, text, length):
  564.         ctx = get_buffer_context(buf)
  565.         if not ctx and not (self.active_placeholder):
  566.             return None
  567.         if not ctx:
  568.             ctx = self.active_placeholder
  569.         
  570.         if ctx not in self.ordered_placeholders:
  571.             return None
  572.         begin = ctx.begin_iter()
  573.         end = ctx.end_iter()
  574.         idx = self.ordered_placeholders.index(ctx)
  575.         for placeholder in self.ordered_placeholders:
  576.             if placeholder == ctx:
  577.                 continue
  578.             
  579.             ob = placeholder.begin_iter()
  580.             oe = placeholder.end_iter()
  581.             if ob.compare(begin) == 0:
  582.                 if not oe or oe.compare(end) == 0:
  583.                     oidx = self.ordered_placeholders.index(placeholder)
  584.                     if oidx > idx and ob:
  585.                         buf.move_mark(placeholder.begin, end)
  586.                     elif oidx < idx and oe:
  587.                         buf.move_mark(placeholder.end, begin)
  588.                     
  589.             oe
  590.             if ob.compare(begin) >= 0 and ob.compare(end) < 0 and oe and oe.compare(end) >= 0:
  591.                 buf.move_mark(placeholder.begin, end)
  592.                 continue
  593.             if (oe or oe.compare(begin) > 0) and ob.compare(begin) <= 0:
  594.                 buf.move_mark(placeholder.end, begin)
  595.                 continue
  596.         
  597.  
  598.     
  599.     def on_notify_language(self, buf, spec):
  600.         self.update_language()
  601.  
  602.     
  603.     def on_notify_editable(self, view, spec):
  604.         self._set_view(view)
  605.  
  606.     
  607.     def on_view_key_press(self, view, event):
  608.         library = Library()
  609.         if not (event.state & gdk.CONTROL_MASK) and not (event.state & gdk.MOD1_MASK) and event.keyval in self.TAB_KEY_VAL:
  610.             if not event.state & gdk.SHIFT_MASK:
  611.                 return self.run_snippet()
  612.             return self.skip_to_previous_placeholder()
  613.         event.keyval in self.TAB_KEY_VAL
  614.         if event.state & gdk.CONTROL_MASK and not (event.state & gdk.MOD1_MASK) and not (event.state & gdk.SHIFT_MASK) and event.keyval in self.SPACE_KEY_VAL:
  615.             return self.show_completion()
  616.         if not (library.loaded) and library.valid_accelerator(event.keyval, event.state):
  617.             library.ensure_files()
  618.             library.ensure(self.language_id)
  619.             self.accelerator_activate(event.keyval, event.state & gtk.accelerator_get_default_mod_mask())
  620.         
  621.         return False
  622.  
  623.     
  624.     def path_split(self, path, components = []):
  625.         (head, tail) = os.path.split(path)
  626.         if not tail and head:
  627.             return [
  628.                 head] + components
  629.         if tail:
  630.             return self.path_split(head, [
  631.                 tail] + components)
  632.         return components
  633.  
  634.     
  635.     def relative_filename(self, first, second, mime):
  636.         prot1 = re.match('(^[a-z]+:\\/\\/|\\/)(.*)', first)
  637.         prot2 = re.match('(^[a-z]+:\\/\\/|\\/)(.*)', second)
  638.         if not prot1 or not prot2:
  639.             return second
  640.         if prot1.group(1) != prot2.group(1):
  641.             return second
  642.         path1 = self.path_split(prot1.group(2))
  643.         path2 = self.path_split(prot2.group(2))
  644.         while path1 and path2 and path1[0] == path2[0]:
  645.             path1.pop(0)
  646.             path2.pop(0)
  647.             continue
  648.             prot1.group(1) != prot2.group(1)
  649.         if len(path1) - 1 > 3:
  650.             return second
  651.         if mime.startswith('x-directory'):
  652.             if not path2:
  653.                 result = './'
  654.             else:
  655.                 result = '../' * (len(path1) - 1)
  656.         else:
  657.             result = '../' * (len(path1) - 1)
  658.             if not path2:
  659.                 result = os.path.basename(second)
  660.             
  661.         if path2:
  662.             result += os.path.join(*path2)
  663.         
  664.         return result
  665.  
  666.     
  667.     def apply_uri_snippet(self, snippet, mime, uri):
  668.         if gedit.utils.uri_has_file_scheme(uri):
  669.             gfile = gio.File(uri)
  670.             uri = gfile.get_path()
  671.         
  672.         filename = self.env_get_filename(self.view.get_buffer())
  673.         os.environ['GEDIT_DROP_FILENAME'] = uri
  674.         os.environ['GEDIT_DROP_MIME_TYPE'] = mime
  675.         os.environ['GEDIT_DROP_REL_FILENAME'] = self.relative_filename(filename, uri, mime)
  676.         buf = self.view.get_buffer()
  677.         mark = buf.get_mark('gtk_drag_target')
  678.         if not mark:
  679.             mark = buf.get_insert()
  680.         
  681.         piter = buf.get_iter_at_mark(mark)
  682.         self.apply_snippet(snippet, piter, piter)
  683.  
  684.     
  685.     def in_bounds(self, x, y):
  686.         rect = self.view.get_visible_rect()
  687.         (rect.x, rect.y) = self.view.buffer_to_window_coords(gtk.TEXT_WINDOW_WIDGET, rect.x, rect.y)
  688.         if not x < rect.x and x > rect.x + rect.width and y < rect.y:
  689.             pass
  690.         return not (y > rect.y + rect.height)
  691.  
  692.     
  693.     def on_drag_data_received(self, view, context, x, y, data, info, timestamp):
  694.         if not gtk.targets_include_uri(context.targets) and data.data and self.in_bounds(x, y):
  695.             return None
  696.         uris = drop_get_uris(data)
  697.         uris.reverse()
  698.         stop = False
  699.         for uri in uris:
  700.             
  701.             try:
  702.                 mime = gio.content_type_guess(uri)
  703.             except:
  704.                 self.in_bounds(x, y)
  705.                 mime = None
  706.  
  707.             if not mime:
  708.                 continue
  709.             
  710.             snippets = Library().from_drop_target(mime, self.language_id)
  711.             if snippets:
  712.                 stop = True
  713.                 self.apply_uri_snippet(snippets[0], mime, uri)
  714.                 continue
  715.         
  716.         if stop:
  717.             context.finish(True, False, timestamp)
  718.             view.stop_emission('drag-data-received')
  719.             view.get_toplevel().present()
  720.             view.grab_focus()
  721.         
  722.  
  723.     
  724.     def find_uri_target(self, context):
  725.         lst = gtk.target_list_add_uri_targets((), 0)
  726.         return self.view.drag_dest_find_target(context, lst)
  727.  
  728.  
  729.